package com.draby.starfantasymaze.methods.game;

import com.draby.starfantasymaze.dto.map.Block;
import com.draby.starfantasymaze.dto.map.Map;
import com.draby.starfantasymaze.enums.Customize;
import com.draby.starfantasymaze.enums.Mode;
import com.draby.starfantasymaze.enums.StatusCode;
import com.draby.starfantasymaze.methods.IGenerateMap;
import com.draby.starfantasymaze.methods.IGenerateMaze;
import com.draby.starfantasymaze.methods.map.BirthdayMap;
import com.draby.starfantasymaze.methods.map.CommonMap;
import com.draby.starfantasymaze.methods.maze.DigWallAlgorithm;

import java.util.Random;

public class CreateGame {
    /* 游戏的模式和自定义模式 */
    private Mode mode;
    private Customize customize;
    /* 用于将模式数据传递给游戏的 activity */
    public Mode getMode() {
        return mode;
    }
    public Customize getCustomize() {
        return customize;
    }

    /* 地图的宽高 */
    private Integer height;
    private Integer width;

    /**
     * 用于创建自定义大小地图
     * @param height 地图高度
     * @param width 地图宽度
     */
    public CreateGame(Integer height, Integer width) {
        this.mode = Mode.CUSTOMIZE;
        this.customize = Customize.CUSTOMIZE;
        this.height = height;
        this.width = width;
    }

    /**
     * 用于创建自定义模式地图
     * @param customize 自定义模式类别
     */
    public CreateGame(Customize customize) {
        this.mode = Mode.CUSTOMIZE;
        this.customize = customize;
    }

    /**
     * 用于创建基础模式地图
     * @param mode 游戏模式
     */
    public CreateGame(Mode mode) {
        this.mode = mode;
    }

    /**
     * 创建游戏
     * @return null: 创建失败，否则返回创建的迷宫地图
     */
    public Map createGame() {
        // 创建地图
        Map map = null;
        // 判断地图是否生成成功
        boolean successMap = false;
        // 判断迷宫是否生成成功
        boolean successMaze = false;
        // 生成地图的方法
        IGenerateMap generateMap;
        // 生成迷宫的方法(凿墙算法)
        IGenerateMaze generateMaze = new DigWallAlgorithm();
        // 判断游戏模式
        switch (mode) {
            // 简单、普通、困难、随机(无尽)模式一致
            case EASY:
            case NORMAL:
            case HARD:
            case RANDOM:
                generateMap = new CommonMap();
                map = generateMap.generateMap(mode);
                successMap = (map != null);
                break;
            // 自定义模式
            case CUSTOMIZE:
                // 判断自定义类别
                switch (customize) {
                    // 自定义地图大小
                    case CUSTOMIZE:
                        generateMap = new CommonMap();
                        map = generateMap.generateMap(mode);
                        successMap = map.initMap(height, width);
                        break;
                    // 生日地图
                    case BIRTHDAY:
                        generateMap = new BirthdayMap();
                        map = generateMap.generateMap(mode);
                        if (map != null) {
                            successMap = true;
                        }
                        break;
                }
                break;
            default:
                break;
        }
        // 判断地图是否生成成功
        if (!successMap) {
            // 未成功则返回 null
            return null;
        }
        // 成功则进行生成迷宫
        successMaze = generateMaze.generateMaze(map);
        // 判断迷宫是否生成成功
        if (!successMaze) {
            // 未成功则返回 null
            return null;
        }
        // 成功则根据游戏模式设置玩家位置与终点位置
        Block[][] maze = map.getMaze();
        int width = map.getWidth();
        int height = map.getHeight();
        Random r = new Random();
        switch (mode) {
            case HARD:
                int rowIdx = r.nextInt(height / 2) + height / 4;
                int colIdx = r.nextInt(width / 2) + width / 4;
                maze[rowIdx][colIdx].setStatusCode(StatusCode.BABY_DRAGON);
            case EASY:
            case NORMAL:
            case RANDOM:
                maze[0][0].setStatusCode(StatusCode.PLAYER);
                maze[height - 1][width - 1].setStatusCode(StatusCode.DESTINATION);
                break;
            // 其他模式（暂不设置）
            case CUSTOMIZE:
                switch (customize) {
                    case CUSTOMIZE:
                        break;
                    // 生日模式
                    case BIRTHDAY:
                        int pYIdx = r.nextInt(11 - 10 + 1) + 10;
                        int dYIdx = r.nextInt(11 - 1 + 1) + 1;
                        maze[0][pYIdx].setStatusCode(StatusCode.PLAYER);
                        maze[height - 1][dYIdx].setStatusCode(StatusCode.DESTINATION);
                        break;
                }
            default:
                break;
        }
        // 将所有状态码为 1 或 2 的格子状态重置(即置0)
        for (int i = 0; i < height; i++) {
            for (int j = 0; j < width; j++) {
                StatusCode code = maze[i][j].getStatusCode();
                if (StatusCode.VISITED.equals(code) || StatusCode.AROUND_VISITED.equals(code)) {
                    maze[i][j].setStatusCode(StatusCode.UNVISITED);
                }
            }
        }
        // 返回生成的迷宫地图
        return map;
    }
}
